package com.bfxy.kafka.api.quickstart;

import com.alibaba.fastjson.JSON;
import com.bfxy.kafka.api.constant.Const;
import com.bfxy.kafka.api.model.User;
import org.apache.kafka.clients.producer.KafkaProducer;
import org.apache.kafka.clients.producer.ProducerConfig;
import org.apache.kafka.clients.producer.ProducerRecord;
import org.apache.kafka.common.serialization.StringSerializer;

import java.util.Properties;

public class QuickStartProducer {

    public static void main(String[] args) {
        // 1.配置生产者启动的关键属性参数
        Properties properties = new Properties();
        // 1.1.连接kafka集群的服务列表，如果有多个，使用”逗号“隔开
        properties.put(ProducerConfig.BOOTSTRAP_SERVERS_CONFIG, "192.168.218.21:9092");
        // 1.2.CLIENT_ID_CONFIG：这个属性的目的是标记kafkaClient的ID
        properties.put(ProducerConfig.CLIENT_ID_CONFIG, "quickstart-producer");
        // 1.3.对kafka的key以及value做序列化，KEY_SERIALIZER_CLASS_CONFIG和VALUE_SERIALIZER_CLASS_CONFIG
        // Q：为什么需要对kafka的key以及value做序列化？
        // A：因为Kafka Broker在接收消息的时候，必须要以二进制的方式接收，所以必须要对key以及value做序列化
        // 字符串序列化类（可以直接用后面这串字符串）：org.apache.kafka.common.serialization.StringSerializer
        // KEY：是kafka用于做消息投递计算具体投递到对应主题的哪一个分区而需要的
        properties.put(ProducerConfig.KEY_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        // VALUE：实际发送消息的内容
        properties.put(ProducerConfig.VALUE_SERIALIZER_CLASS_CONFIG, StringSerializer.class.getName());
        // try的括号种进行创建资源连接的写法的作用：在try语句结束后自动释放，前提是这些可关闭的资源必须实现 java.lang.AutoCloseable 接口。此时，就不用再finally中进行资源的释放了。
        // 2.创建kafka生产者对象，传递properties属性参数集合
        try (KafkaProducer<String, String> producer = new KafkaProducer<>(properties)) {
            for (int i = 0; i < 10; i++) {
                // 3.构造消息内容
                User user = new User("00" + i, "张三");
                // arg1：topic，arg2：实际的消息体内容
                ProducerRecord<String, String> record = new ProducerRecord<>(Const.TOPIC_QUICKSTART, JSON.toJSONString(user));

                // 4.发送消息
                producer.send(record);
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
    }

}
